﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AteneoLibriBusinessLogic.Entities;
using AteneoLibri.DomainObject;

namespace AteneoLibri.Account
{
    public partial class Conversations : System.Web.UI.Page
    {
        User user = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            user = Utility.HttpSessionManager.GetWebUser();
            if (user != null)
            {
                using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                {
                    // Carico le vendite create dall'utente loggato
                    List<Sale> sales = service.getSalesByUserId(user.IdUser);
                    List<SaleInfo> requestPurchasing = LoadPurchasingSaleInformation(sales);

                    // Mi devo prendere da Sale tutte le vendite relative ai miei libri
                    List<Book> myBooks = service.getBooksByIdUser(user.IdUser);
                    List<Sale> myRequestForSale = new List<Sale>();

                    foreach (var item in myBooks)
                    {
                        // devo vedere sè il libro ha una vendita associata
                        List<Sale> sales2book = service.getSalesByBookId(item.IdBook); // vendite relative ad un libro
                        myRequestForSale.AddRange(sales2book);
                    }

                    List<SaleInfo> requestedSales = LoadRequestForSale(myRequestForSale);

                    gvPurchasing.DataSource = requestPurchasing;
                    gvPurchasing.DataBind();

                    gvPurchasingPortrait.DataSource = requestPurchasing;
                    gvPurchasingPortrait.DataBind();

                    gvSessionSales.DataSource = requestedSales;
                    gvSessionSales.DataBind();

                    gvSessionSalesPortrait.DataSource = requestedSales;
                    gvSessionSalesPortrait.DataBind();
                }
            }
            else
            {
                // Redirect per sessione scaduta
                Response.Redirect("~/Logout.aspx");
            }
            
        }

        private List<SaleInfo> LoadRequestForSale(List<Sale> myRequestForSale)
        {
            List<SaleInfo> requestSaleInfoList = new List<SaleInfo>();
            foreach (var item in myRequestForSale)
            {
                // creo un nuovo oggetto SaleInfo
                SaleInfo saleInfo = new SaleInfo();

                saleInfo.IdSale = item.IdSale;
                saleInfo.StartDate = item.StartDate;
                saleInfo.EndDate = item.EndDate;
                saleInfo.UserIdPurchaser = item.UserIdPurchaser;

                // a partire dal bookId devo estrarre tutte le informazioni necessarie
                // copierò il sellingPrice all'interno della vendita. CHECK: Non dovevo farlo all'atto della definizione della nuova vendita?
                using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                {
                    Book book = service.getBookById(item.BookId.Value);
                    saleInfo.Title = book.Title;
                    saleInfo.SellingPrice = book.SellingPrice;

                    User purchaserUser = service.getUserById(item.UserIdPurchaser.Value);
                    saleInfo.Purchaser = purchaserUser.Username;
                }
                requestSaleInfoList.Add(saleInfo);
            }

            return requestSaleInfoList;
        }

        private List<SaleInfo> LoadPurchasingSaleInformation(List<Sale> sales)
        {
            // Qui mi devo costruire i nuovi oggetti che poi devo bindare nella griglia
            List<SaleInfo> saleInfoList = new List<SaleInfo>();

            foreach (var item in sales)
            {
                // creo un nuovo oggetto SaleInfo
                SaleInfo saleInfo = new SaleInfo();

                saleInfo.IdSale = item.IdSale;
                saleInfo.StartDate = item.StartDate;
                saleInfo.EndDate = item.EndDate;
                saleInfo.UserIdPurchaser = item.UserIdPurchaser;

                // a partire dal bookId devo estrarre tutte le informazioni necessarie
                // copierò il sellingPrice all'interno della vendita. CHECK: Non dovevo farlo all'atto della definizione della nuova vendita?
                using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                {
                    Book book = service.getBookById(item.BookId.Value);
                    saleInfo.Title = book.Title;
                    saleInfo.SellingPrice = book.SellingPrice;

                    User sellerUser = service.getUserById(book.UserId);
                    saleInfo.Owner = sellerUser.Username;
                }

                saleInfoList.Add(saleInfo);
            }

            return saleInfoList;
        }

        protected void btnDetails_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton button = sender as ImageButton;
            string idSale = button.CommandArgument;

            // prendo anche l'id del proprietario del libro
            using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
            {
                Book book = service.getBookByIdSale(new Guid(idSale));
                User sellerUser = service.getUserByIdBook(book.IdBook);

                Response.Redirect("~/Account/Messages.aspx?IdSale=" + idSale + "&SellerUserId=" + sellerUser.IdUser);
            }
            
        }

        protected void btnRequestSaleDetails_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton button = sender as ImageButton;
            string idSale = button.CommandArgument;

            // prendo anche l'id del proprietario del libro
            using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
            {
                User purchaserUser = service.getUserIdByIdSale(new Guid(idSale));

                Response.Redirect("~/Account/Messages.aspx?IdSale=" + idSale + "&PurchaseUserId=" + purchaserUser.IdUser);
            }

        }

        protected void gvPurchasing_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvPurchasing.PageIndex = e.NewPageIndex;
            gvPurchasing.DataBind();
        }

        protected void gvPurchasingPortrait_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvPurchasingPortrait.PageIndex = e.NewPageIndex;
            gvPurchasingPortrait.DataBind();
        }

        protected void gvSessionSales_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvSessionSales.PageIndex = e.NewPageIndex;
            gvSessionSales.DataBind();
        }

        protected void gvSessionSalesPortrait_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvSessionSalesPortrait.PageIndex = e.NewPageIndex;
            gvSessionSalesPortrait.DataBind();
        }
    }
}